#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>

/**
标准输入输出流 （File *）
    FILE *stdin;   标准输入
    FILE *stdout;  标准输出
    FILE *stderr;  标准错误输出
标准输出输出流的文件描述符
    STDIN_FILENO    0  标准输入
    STDOUT_FILENO   1  标准输出
    STDERR_FILENO   2  标准错误输出
 */

int main(int argc, char const *argv[])
{
    // 1.关闭标准输出
    close(STDOUT_FILENO);
    // 2.关闭标准错误输出
    close(STDERR_FILENO);

    // 3.打开标准输出文件 (0644权限: 所有者可读可写，组和其他可读)
    open("std_out.log", O_CREAT | O_WRONLY | O_APPEND, 0644);
    // 4.打开标准错误输出文件 (0644权限)
    open("std_err_out.log", O_CREAT | O_WRONLY | O_APPEND, 0644);

    // 5.利用stdin来读取标准输入
    char input1[100];
    fgets(input1, 100, stdin);
    printf("利用stdio来读取标准输入:%s", input1);

    // 6.利用stdout来写标准输出 （打印）
    fputs("利用stdout来写标准输出 \n", stdout);
    fputs("利用stdout来写标准输出 \n", stderr);

    // 7.利用STDIN_FILENO来读取标准输入
    char input2[100];
    int len = read(STDIN_FILENO, input2, sizeof(input2));
    printf("利用STDIN_FILENO来读取标准输入:%.*s", len, input2);

    // 8.利用STDOUT_FILENO来写标准输出
    write(STDOUT_FILENO, "利用STDOUT_FILENO来写标准输出 \n", strlen("利用STDOUT_FILENO来写标准输出 \n"));
    // 9.利用STDERR_FILENO来写标准错误输出
    write(STDERR_FILENO, "利用STDERR_FILENO来写标准错误输出 \n", strlen("利用STDERR_FILENO来写标准错误输出 \n"));

    return 0;
}
